Skip to content

[PGS] 지게차와 크레인 - #83

Open
been12151 wants to merge 20 commits into
mainfrom
week4/forklift-and-crane
Open

[PGS] 지게차와 크레인#83
been12151 wants to merge 20 commits into
mainfrom
week4/forklift-and-crane

Conversation

@been12151

Copy link
Copy Markdown
Owner

🍪 문제 이름

Resolve: 지게차와 크레인

🍊 문제 정의

input

  • storage : 창고의 컨테이너 배치 상태를 나타내는 문자열 배열 (n × m 크기, 알파벳 대문자)
  • requests : 출고 요청 배열 (길이 1이면 지게차, 길이 2이면 크레인)

output

  • 모든 요청 처리 후 창고에 남은 컨테이너 수

예시

storage requests result
["AABBC", "CAABC", "BBCCA", "CBABC"] ["A", "BB", "A"] 11

🍑 알고리즘 설계

창고 주변을 .으로 패딩해 외부 영역을 명시적으로 만든 뒤, BFS로 외부와 연결된 빈 칸(outside)을 탐색.

  • 지게차 (len==1): outside에 인접한 해당 문자 칸을 모아 한 번에 제거
  • 크레인 (len==2): 해당 문자 칸을 전부 제거

요청마다 BFS로 outside를 갱신해 이전 제거로 새로 외부와 연결된 칸도 반영.

from collections import deque

def solution(storage, requests):
    n, m = len(storage), len(storage[0])
    grid = [['.'] * (m + 2)]
    for row in storage:
        grid.append(['.'] + list(row) + ['.'])
    grid.append(['.'] * (m + 2))
    N, M = n + 2, m + 2

    for req in requests:
        if len(req) == 2:
            ch = req[0]
            for i in range(N):
                for j in range(M):
                    if grid[i][j] == ch:
                        grid[i][j] = '.'
        else:
            ch = req
            visited = [[False] * M for _ in range(N)]
            q = deque([(0, 0)])
            visited[0][0] = True
            outside = {(0, 0)}
            while q:
                y, x = q.popleft()
                for dy, dx in ((-1,0),(1,0),(0,-1),(0,1)):
                    ny, nx = y+dy, x+dx
                    if 0<=ny<N and 0<=nx<M and not visited[ny][nx] and grid[ny][nx]=='.':
                        visited[ny][nx] = True
                        outside.add((ny, nx))
                        q.append((ny, nx))
            to_remove = []
            for i in range(N):
                for j in range(M):
                    if grid[i][j] == ch:
                        for dy, dx in ((-1,0),(1,0),(0,-1),(0,1)):
                            if (i+dy, j+dx) in outside:
                                to_remove.append((i, j))
                                break
            for i, j in to_remove:
                grid[i][j] = '.'

    return sum(1 for row in grid for cell in row if cell != '.')

🥝 최악 수행 시간 복잡도

  • O(r × n × m) (r = requests 길이, n × m = 창고 크기)
  • 요청마다 BFS로 전체 그리드를 탐색하므로 O(n × m), 이를 r번 반복

🍰 특이 사항 (Optional)

지게차 처리 시 제거 대상을 바로 지우지 않고 to_remove에 모아 한 번에 처리한 부분이 중요. 즉시 제거하면 인접 칸이 새로 외부와 연결되어 같은 요청 내에서 연쇄 제거가 발생할 수 있음.

@been12151
been12151 requested review from gayo73 and yangyeeeun July 13, 2026 13:53
@been12151 been12151 self-assigned this Jul 13, 2026
@been12151 been12151 linked an issue Jul 14, 2026 that may be closed by this pull request
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[PGS] 지게차와 크레인 / level 2

2 participants